/**
声明一个函数类型
函数当做值和类型在我们写一些通用接口的时候非常有用
2018/8/11
wgg
*/
package main

import "fmt"

type testInt func(int) bool //声明一个函数类型

func isOdd(integer int) bool  {
	if integer%2 == 0 {
		return  false
	}
	return true
}

func isEven(integer int) bool  {
	if integer%2 == 0 {
		return  true
	}
	return  false
}

/*
根据传入的函数名称，调用相应的函数完成相应的操作
 */
func filter(slice *[]int, f testInt) []int  {
	var result []int
	//获取相应的指针信息
	for _,value := range *slice {
		//根据相应的传入的函数类型，调用相应的函数
		if f(value) {
			result = append(result,value)
		}
	}
	return result
}

func main() {
	slice := []int {1,2,3,4,5,7}
	fmt.Println("slice = ",slice)
	odd := filter(&slice,isOdd) // 对于数据量偏大的信息，以传递地址为主,函数当作值来传递
	fmt.Println("odd elements of slice are: ",odd)
	even := filter(&slice,isEven)
	fmt.Println("even elements of slice are: ",even)

}
